
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

typedef struct person//定义一个单链表 
{
    int number;
    char name[40];
    char relation[40];
    struct person* next;
}person, * personlink;

void print(personlink l)//用于打印的函数 
{
    personlink p = l->next;//使p指向头文件的下一个文件 
    while (p != NULL)//一直打印直到没有下一个文件 
    {
        printf("%s：%d %s\n", p->name, p->number, p->relation);
        p = p->next;
    }
}

void creat(personlink l)//用于创立通讯录的函数 
{
    int num;//用于指示操作与赋值 
    char name[40];
    char relation[40];
    personlink p,q;
    
    while (1)
    {	q=l;
        printf("请以电话号码，姓名，关系的顺序输入：（以-1作为结束）");
        scanf("%d", &num);
        if (num == -1) break;//当输入的数字等于-1时退出循环 
        p = (personlink)malloc(sizeof(person));
        scanf("%s%s", p->name, p->relation);//赋值 
        
        p->number = num;
        
        while(q->next !=NULL&&strcmp(q->next->name,p->name)<0)//依据名字的首字母（strcmp来比较字母大小）利用直接插入法进行排序
        {
        	q=q->next;
		}
        //结束循环时q就是目标位置
			p->next = q->next;//插入 
        	q->next = p;
		
    }
}

void search(personlink l, char* s)//用于寻找的函数 
{
    personlink p = l->next;
    while (p != NULL)
    {
        if (strcmp(p->name, s) == 0)//当字符串相等时返回0 
        {
            printf("%d\n", p->number);//打印ta的电话 
            return;
        }
        p = p->next;
    }
    printf("查无此人\n");//当执行到这一步时说明p==NULL 
}
void dele(personlink l,char*s)
{ 	personlink p = l;//删除时应该使p指向头指针 
    while (p != NULL)
    {
        if (strcmp(p->next->name, s) == 0)//判断下一个节点是不是查找的节点 
        {
            personlink q;
            q=p->next;
            p->next=q->next;
            free(q);//创立一个临时变量q来进行删除操作 
            printf("成功删除！^_^\n");
            return;
        }
        p = p->next;
    }
    printf("查无此人,可能此人已删除@_@\n");
	
	
	
 } 
int main()
{
    int num;//作为指示操作的变量 
    personlink l;
    l = (personlink)malloc(sizeof(person));
    l->next = NULL;//初始化头指针 
    char s[40];
    while (1)
    {
        printf("请选择您的操作：（1表示输入，2表示查找，3表示打印，4表示删除，0表示退出）");
        scanf("%d", &num);
        switch (num)
        {
        case 1:
            creat(l);
            break;
        case 2:
            printf("请输入要查找的人的姓名：");
            scanf("%s", s);
            search(l, s);
            break;
        case 3:
            print(l);
            break;
        case 4:
        	printf("请输入想要删除的人的姓名：");
        	scanf("%s",s); 
			dele(l,s); 
			break;
        case 0:
            return 0;
        default:
			printf("输入错误(o.0)，请重新输入！\n");
            break;
        }
    }
    return 0;
}

